{% extends "base_with_sidebar.html" %}
{% load i18n %}
{% load static %}

{% block title %}
    {% trans '对象存储API使用说明' %}
{% endblock %}

{% block content %}
    <div class="container-fluid">

        <div class="text-center">
            <h3>AWS S3 兼容 API使用说明</h3>
            <p>修改时间：2024-05-31 09:55:35</p>
        </div>
        <hr>
        <div><p>&nbsp;iHarbor服务提供兼容AWS S3接口的部分访问。</p>

            <p><strong>s3域名：{{ s3_domain_name.content }}</strong></p>


            <div class="nav-list" id="security-nav-list">
                <div class="card border-danger nav-list-item" id="nav-list-auth-key">
                    <div class="card-header" data-toggle="collapse" data-target="#nav-list-auth-key-body">
                        <i class="far fa-dot-circle"></i><span>{% trans '访问密钥对' %}</span></div>
                    <div class="card-body collapse show" id="nav-list-auth-key-body">
                        <div class="">
                            <p>
                                每个访问密钥包含access_key和secret_key密钥对，访问密钥不只是简单的身份认证，每次http请求前都需要根据请求的url的path和有效期时间戳重新计算auth_key字符串，此认证方式安全性高，使用稍微复杂一些(具体生成过程请参考帮助文档)。
                                auth_key的格式为“evhb-auth {access_key}:{hmac_sha1}:{data_base64}”，应包含在Authorization
                                HTTP标头中，密钥应以字符串文字“evhb-auth”为前缀，空格分隔两个字符串。
                            <p class="text-info">例如：Authorization: evhb-auth xxx:xxx:xxx</p>
                            </p>
                            <table class="table table-hover" id="auth-key-table">
                                <tr class="bg-light">
                                    <th>{% trans '创建时间' %}</th>
                                    <th>{% trans '访问密钥' %}(access_key)</th>
                                    <th>{% trans '秘密密钥' %}(secret_key)</th>
                                    <th>{% trans '备注' %}</th>
                                    <th>{% trans '状态' %}</th>
                                    <th>{% trans '操作' %}</th>
                                </tr>
                                {% if auth_keys %}
                                    {% for key in auth_keys %}
                                        <tr>
                                            <td>{{ key.create_time | date:'Y-m-d H:i:s' }}</td>
                                            <td>{{ key.access_key }}</td>
                                            <td>
                                                <input title="{{ key.secret_key }}" class="secret-key" readonly
                                                       type="password" value="{{ key.secret_key }}"
                                                       style="border: 0px;outline:none;">
                                                <span class="btn btn-outline-info secret-key-display"><i
                                                        class="fa fa-eye"></i></span>
                                            </td>
                                            <td>{{ key.remark }}</td>
                                            {% if key.state %}
                                                <td class="text-success">{% trans '使用中' %}</td>
                                            {% else %}
                                                <td class="text-warning">{% trans '停用' %}</td>
                                            {% endif %}
                                            <td>
                                                {% if key.state %}
                                                    <span class="btn btn-info btn-stop-auth-key">{% trans '停用' %}</span>
                                                    <span class="btn btn-primary btn-update-auth-key">{% trans '更新' %}</span>
                                                {% else %}
                                                    <span class="btn btn-info btn-active-auth-key">{% trans '启用' %}</span>
                                                {% endif %}
                                                <span class="btn btn-danger btn-remove-auth-key"><i
                                                        class="fa fa-trash-alt"></i></span>
                                            </td>
                                        </tr>
                                    {% endfor %}
                                {% endif %}
                            </table>
                            <span class="btn btn-primary" id="btn-create-auth-key"><i
                                    class="fa fa-plus"></i>{% trans '创建新访问密钥' %}</span>
                        </div>
                    </div>
                </div>

            </div>


            <p><strong>一 注意事项</strong></p>

            <p>1. iharbor服务兼容AWS S3 部分接口，对桶和文件操作与原生接口功能相同；</p>

            <p>2.&nbsp;iHarbor服务有目录的概念，同一路径下不支持同名的对象和目录存在，不支持删除非空目录；</p>

            <p>3. 使用AWS S3 多部分上传UploadPart接口限制：</p>

            <p>&nbsp; &nbsp; (a) 必须先上传编号为 1 的块；</p>

            <p>&nbsp; &nbsp; (b) 上传的每一块的大小必须与编号为 1 的块的大小一致，最后一块除外；</p>

            <p>&nbsp; &nbsp; (c) 块可以无序上传（编号为1的块除外）；</p>

            <p>4.&nbsp;使用AWS S3 合并CompleteMultipartUpload接口注意点：&nbsp;</p>

            <p>&nbsp; &nbsp; (a) 上传的块信息编号从1开始，编号必须是连续的，并且升序，否则无法合并文件；</p>

            <p>5. 目前不支持对象锁，同时上传同一个对象，可能产生脏数据；</p>

            <p>二&nbsp;<strong>&nbsp;域名endpoint</strong></p>

            <p>&nbsp; &nbsp; 支持virtual-hosted style URL访问bucket的方式,&nbsp;无region,
                endpoint格式：http(s)://BUCKET.obss3.cstcloud.cn;</p>

            <p>&nbsp; &nbsp; 支持path style URL访问bucket的方式，无region,
                endpoint格式：http(s)://obss3.cstcloud.cn/BUCKET;</p>

            <p><strong>三&nbsp; 存储类型</strong></p>

            <p>&nbsp;&nbsp;&nbsp;&nbsp;对象存储iHarbor只支持标准（STANDARD）一种存储类型, 默认为STANDARD。</p>

            <p><strong>四&nbsp; 签名认证</strong></p>

            <p>&nbsp;&nbsp;&nbsp;&nbsp;兼容AWS Signature Version 4，支持请求头签名和参数签名方式；</p>

            <p>&nbsp; &nbsp; 数据上传方式只支持单个块传输，不支持多块传输方式(Content-Encoding:aws-chunked)；</p>

            <p><strong>五&nbsp; 公共标头</strong></p>

            <table align="center" border="1" cellpadding="1" cellspacing="1" style="width:500px">
                <thead>
                <tr>
                    <th scope="col" style="text-align:center">标头</th>
                    <th scope="col" style="text-align:center">说明</th>
                </tr>
                </thead>
                <tbody>
                <tr>
                    <td style="text-align:center">Authorization</td>
                    <td style="text-align:center">兼容</td>
                </tr>
                <tr>
                    <td style="text-align:center">Content-Length</td>
                    <td style="text-align:center">兼容</td>
                </tr>
                <tr>
                    <td style="text-align:center">Content-Type</td>
                    <td style="text-align:center">兼容</td>
                </tr>
                <tr>
                    <td style="text-align:center">Content-MD5</td>
                    <td style="text-align:center">兼容</td>
                </tr>
                <tr>
                    <td style="text-align:center">Date</td>
                    <td style="text-align:center">兼容</td>
                </tr>
                <tr>
                    <td style="text-align:center">Host</td>
                    <td style="text-align:center">兼容</td>
                </tr>
                <tr>
                    <td style="text-align:center">ETag</td>
                    <td style="text-align:center">兼容</td>
                </tr>
                <tr>
                    <td style="text-align:center">x-amz-request-id</td>
                    <td style="text-align:center">不支持</td>
                </tr>
                <tr>
                    <td style="text-align:center">x-amz-id-2</td>
                    <td style="text-align:center">不支持</td>
                </tr>
                <tr>
                    <td style="text-align:center">x-amz-version-id</td>
                    <td style="text-align:center">不支持</td>
                </tr>
                </tbody>
            </table>

            <p><strong>六 兼容API</strong></p>

            <p>1. Service API</p>

            <table align="center" border="1" cellpadding="1" cellspacing="1" style="width:500px">
                <thead>
                <tr>
                    <th scope="col">API</th>
                    <th scope="col">请求</th>
                    <th scope="col">响应</th>
                </tr>
                </thead>
                <tbody>
                <tr>
                    <td>ListBuckets</td>
                    <td>兼容</td>
                    <td>兼容</td>
                </tr>
                </tbody>
            </table>

            <p>&nbsp;</p>

            <p>2.&nbsp; Bucket API</p>

            <table align="center" border="1" cellpadding="1" cellspacing="1" style="width:90%">
                <thead>
                <tr>
                    <th scope="col">API</th>
                    <th scope="col">请求</th>
                    <th scope="col">响应</th>
                </tr>
                </thead>
                <tbody>
                <tr>
                    <td>CreateBucket</td>
                    <td>
                        <p>不支持区域指定，不需要请求体；<br>
                            参数x-amz-acl部分支持，有效值: private，public-read，public-read-write；</p>

                        <p>其他参数不支持；</p>
                    </td>
                    <td>兼容</td>
                </tr>
                <tr>
                    <td>DeleteBucket</td>
                    <td>兼容</td>
                    <td>兼容</td>
                </tr>
                <tr>
                    <td>HeadBucket</td>
                    <td>兼容</td>
                    <td>兼容</td>
                </tr>
                </tbody>
            </table>

            <p>&nbsp;</p>

            <p>3.&nbsp; Object API</p>

            <table align="center" border="1" cellpadding="1" cellspacing="1" style="width:90%">
                <thead>
                <tr>
                    <th scope="col">API</th>
                    <th scope="col">请求</th>
                    <th scope="col">响应</th>
                    <th scope="col">说明</th>
                </tr>
                </thead>
                <tbody>
                <tr>
                    <td>PutObject</td>
                    <td>
                        <p>支持请求头:<br>
                            x-amz-storage-class只能取值STANDARD，默认STANDARD；<br>
                            x-amz-acl部分支持，有效值: private，public-read，public-read-write；</p>

                        <p>其他参数不支持；</p>
                    </td>
                    <td>仅兼容ETag</td>
                    <td>只支持基础上传功能，目录创建</td>
                </tr>
                <tr>
                    <td>DeleteObject</td>
                    <td>VersionId参数不支持，标头x-amz-*不支持；</td>
                    <td>标头x-amz-*不支持；</td>
                    <td>只支持基础删除功能，删除对象或目录，此请求会直接物理永久删除对象</td>
                </tr>
                <tr>
                    <td>DeleteObjects</td>
                    <td>标头x-amz-*不支持；</td>
                    <td>标头x-amz-*不支持；</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>ListObjects</td>
                    <td>标头x-amz-*不支持；</td>
                    <td>兼容</td>
                    <td>无</td>
                </tr>
                <tr>
                    <td>ListObjectV2</td>
                    <td>兼容</td>
                    <td>兼容</td>
                    <td>无</td>
                </tr>
                <tr>
                    <td>GetObject</td>
                    <td>
                        <p>支持标头：Range, If-*；<br>
                            仅支持参数：partNumber，response-content-disposition，response-content-type，response-content-encoding，
                            response-content-language；</p>
                    </td>
                    <td>兼容标头：Last-Modified, Content-Length, ETag, Content-Disposition,
                        Content-Encoding，Content-Language，Content-Range，Content-Type；
                    </td>
                    <td>无</td>
                </tr>
                <tr>
                    <td>HeadObject</td>
                    <td>支持标头：Range, If-*；<br>
                        支持参数：partNumber；
                    </td>
                    <td>兼容标头：Last-Modified, Content-Length, ETag, Content-Range，Content-Type；</td>
                    <td>无</td>
                </tr>
                <tr>
                    <td>CreateMultipartUpload</td>
                    <td>标头x-amz-acl部分支持，有效值: private，public-read，public-read-write；<br>
                        标头x-amz-storage-class默认并只能为STANDARD, 其他参数不支持；
                    </td>
                    <td>标头x-amz-*不兼容</td>
                    <td>仅支持基础功能</td>
                </tr>
                <tr>
                    <td>AbortMultipartUpload</td>
                    <td>标头x-amz-request-payer不支持；</td>
                    <td>标头x-amz-request-payer不支持；</td>
                    <td>无</td>
                </tr>
                <tr>
                    <td>CompleteMultipartUpload</td>
                    <td>标头参数不支持；</td>
                    <td>标头x-amz-*不兼容</td>
                    <td>仅支持基础功能；part越多，大小越大，合并一个对象需要的时间越长;<br>
                        如果已请求合并未响应之前，重试发起第二次请求，会得到一个CompleteMultipartAlreadyInProgress错误码；
                    </td>
                </tr>
                <tr>
                    <td>UploadPart</td>
                    <td>
			<pre><span
                    style="font-family:sans-serif,Arial,Verdana,&quot;Trebuchet MS&quot;,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;,&quot;Segoe UI Symbol&quot;">支持x-amz-content-sha256 数据校验; 标头x-amz-*不支持</span>
</pre>
                    </td>
                    <td>标头x-amz-*不支持</td>
                    <td>
                        <p>仅支持基础上传功能</p>
                    </td>
                </tr>
                <tr>
                    <td>ListMultipartUploads</td>
                    <td>不支持参数delimiter</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>ListParts</td>
                    <td>标头 x-amz* 不支持</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>CopyObject</td>
                    <td>
                        <p>x-amz-acl部分支持，有效值: private，public-read，public-read-write；</p>

                        <p>支持标头：x-amz-copy-source; x-amz-copy-source-if*</p>
                    </td>
                    <td>标头x-amz-*不支持；</td>
                    <td>复制对象仅支持2GiB大小以内对象</td>
                </tr>
                </tbody>
            </table>

            <p>&nbsp;</p>

            <p>&nbsp;</p>

            <p>&nbsp;</p></div>

    </div>
{% endblock %}


{% block script_extends %}
    <script type="text/javascript" src="{% static 'art-template/template-web.js' %}"></script>
    <script type="text/javascript" src="{% static 'users/users.js' %}"></script>
{% endblock %}